Kubernetes中的Port

简单区分Kubernetes中的不同port。

containerPort vs. hostPort

出现在如Deployment、Pod等资源对象描述文件中的容器部分,针对容器端口起类似于docker run -p <containerPort>:<hostPort>的作用:
containerPort:容器暴露的端口。
hostPort:容器暴露的端口直接映射到的主机端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: extensions/v1beta1
kind: Deployment
...
spec:
...
template:
spec:
containers:
- name: tomcat
image: tomcat:8
ports:
- containerPort: 8080
hostPort: 80
...

此时,用户可以直接访问宿主机的80端口访问容器。

port vs. targetPort vs. nodePort

出现在Service描述文件中,当Service的类型为ClusterIP时:
port:Service中ClusterIP对应的端口。
targetport:clusterIP作为负载均衡, 后端目标实例(容器)的端口,与上述containerPort保持一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
...
name: tomcatapp
spec:
...
type: ClusterIP
ports:
- name: app
protocol: TCP
port: 10080
targetPort: 8080

此时,同一集群的容器可以通过http://tomcatapp:10080访问该Service。

当Service的类型为NodePort时:
nodePort:由于ClusterIP只能集群内访问,配置nodePort会在每个运行kubelet节点的宿主机打开一个端口,用于集群外部访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Service
metadata:
...
name: tomcatapp
spec:
...
type: NodePort
ports:
- name: app
protocol: TCP
port: 10080
targetPort: 8080
nodePort: 30080

此时,集群外的用户可以通过http://<宿主机IP>:30080访问;同时,ClusterIP仍然生效,同一集群的容器仍可通过http://tomcatapp:10080访问该Service。
当然,上述正常访问的前提条件是:相关节点的kube-proxy正常运行且跨主机容器网络通信正常。